iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Mobile Development

Spring Boot & Android Studio教學系列 第 12

@ManyToMany:多對多關係的實現

  • 分享至 

  • xImage
  •  

多對多關係是指一個實體類別可以與多個其他實體類別相關聯,同時其他實體類別也可以與該實體類別相關聯。

範例

假設一扇門可以用多把不同的鑰匙打開,一把鑰匙也對應多扇門,這就是多對多的關聯

Key.java

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Key {
    @Id
    @GeneratedValue
    private Long id;
    private String keyName;

     @ManyToMany(mappedBy = "door")
//    @JsonIgnore
    @JsonIgnoreProperties("door")
    @Builder.Default
    private List<Key> key = new ArrayList<>();
}

Door.java

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Key {
    @Id
    @GeneratedValue
    private Long id;
    private String keyName;

    @ManyToMany
    @JoinTable(
            name = "door_key",
            joinColumns = @JoinColumn(name = "key_id"),
            inverseJoinColumns = @JoinColumn(name = "door_id")
    )
    @JsonIgnoreProperties("key")
//    @JsonIgnore
    @Builder.Default
    private List<Door> door = new ArrayList<>();
}

講解

@JoinTable

當你在實體之間建立多對多關聯時,通常需要一個中介表來存儲這些關聯 @JoinTable 就是用於設定多對多關聯的中介表。
name:指定中介表的名稱。
joinColumns:指定一個或多個列(欄位)來關聯當前實體的外鍵。
inverseJoinColumns:指定一個或多個列(欄位)來關聯另一個實體的外鍵。

@JsonIgnoreProperties

用於控制序列化和反序列化過程中的 JSON 屬性排除。
@JsonIgnoreProperties("door") 和 @JsonIgnoreProperties("key")。這表示在轉換為 JSON 時,Jackson 將忽略 Door 物件中的 key 屬性,以及 Key 物件中的 door 屬性,從而避免無限循環。

新增關聯

@PostMapping("/many")
    public Door createDoorWithKey(){
        var door = Door
                .builder()
                .doorName("一號門")
                .type("open")
                .build();
        doorRepository.save(door);

        var key = Key
                .builder()
                .keyName("多功能鑰匙")
                .build();
        keyRepository.save(key);

        //建立關聯
        door.getKey().add(key);
        key.getDoor().add(door);
        
        doorRepository.save(door);
        return door;
    }

參考資料


上一篇
建立實體關係:@ManyToOne和@OneToMany的用法
下一篇
OpenAPI 3.0解析:輕鬆建立和管理RESTful API
系列文
Spring Boot & Android Studio教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言